home *** CD-ROM | disk | FTP | other *** search
- #ifdef __STDC__
- static char sccs_id[] = "@(#) ctime.c 2.0 "__DATE__" HJR";
- #else
- static char sccs_id[] = "@(#) ctime.c 2.0 26/9/90 HJR";
- #endif
-
- /* ctime.c (c) Copyright 1990 H.Rogers */
-
- #include <time.h>
- #include <stdio.h>
- #include <ctype.h>
-
- static char *__tdays[] =
- { "Sun","Mon","Tue","Wed","Thu","Fri","Sat" };
- static char *__tdayl[] =
- { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
- static char *__tmonths[] =
- { "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec" };
- static char *__tmonthl[] =
- { "January","February","March","April","May","June","July","August",
- "September","October","November","December" };
-
- /* standard representations (take care to avoid making
- * strftime() call itself recursively ad infinitum) */
-
- static char *__dtrep = "%a %b %d %H:%M:%S %Y";
- static char *__drep = "%a %b %d %Y";
- static char *__trep = "%H:%M:%S";
-
- #ifdef __STDC__
- char *asctime(register const struct tm *t)
- #else
- char *asctime(t)
- register const struct tm *t;
- #endif
- {
- static char _buf[26];
- register char *buf = _buf;
-
- buf += strftime(buf,24,__dtrep,t); *buf++ = '\n'; *buf++ = 0;
-
- return(_buf);
- }
-
- #ifdef __STDC__
- char *ctime(register const time_t *tp)
- #else
- char *ctime(tp)
- register const time_t *tp;
- #endif
- {
- return(asctime(localtime(tp)));
- }
-
- #ifdef __STDC__
- size_t strftime(register char *buf,register size_t max,
- register const char *fmt,register const struct tm *t)
- #else
- size_t strftime(buf,max,fmt,t)
- register char *buf;
- register size_t max;
- register const char *fmt;
- register const struct tm *t;
- #endif
- {
- register int i = max;
-
- while (*fmt && i)
- {
- if (*fmt != '%' || *++fmt == '%') /* left to right evaluation */
- { *buf++ = *fmt++,i--; continue; }
-
- {
- register char *s;
- register int j;
-
- switch (*fmt)
- {
- case 'a':
- s = __tdays[t->tm_wday]; scp: while((*buf = *s) && i) buf++,s++,i--;
- break;
- case 'A':
- s = __tdayl[t->tm_wday];
- goto scp;
- case 'b':
- s = __tmonths[t->tm_mon];
- goto scp;
- case 'B':
- s = __tmonthl[t->tm_mon];
- goto scp;
- case 'c':
- j = strftime(buf,i,__dtrep,t); buf += j,i -= j;
- break;
- case 'd':
- if (i >= 2) sprintf(buf,"%2d",t->tm_mday); buf += 2,i -= 2;
- break;
- case 'H':
- if (i >= 2) sprintf(buf,"%.2d",t->tm_hour); buf += 2,i -= 2;
- break;
- case 'I':
- j = t->tm_hour; if (j > 12) j -= 12;
- if (i >= 2) sprintf(buf,"%2d",j); buf += 2,i -= 2;
- break;
- case 'j':
- if (i >= 3) sprintf(buf,"%3d",t->tm_yday); buf += 3,i -= 3;
- break;
- case 'm':
- if (i >= 2) sprintf(buf,"%2d",t->tm_mon); buf += 2,i -= 2;
- break;
- case 'M':
- if (i >= 2) sprintf(buf,"%.2d",t->tm_min); buf += 2,i -= 2;
- break;
- case 'p':
- s = (t->tm_hour > 12) ? "PM" : "AM";
- goto scp;
- case 'S':
- if (i >= 2) sprintf(buf,"%.2d",t->tm_sec); buf += 2,i -= 2;
- break;
- case 'U':
- j = t->tm_yday;
- if (j > 2) j += (4 - t->tm_wday);
- if (i >= 2) sprintf(buf,"%2d",j / 7); buf += 2,i -= 2;
- break;
- case 'w':
- *buf++ = t->tm_wday + '0'; i--;
- break;
- case 'W':
- j = t->tm_yday;
- if (j > 2) j += (5 - ((j = t->tm_wday) ? j : 7));
- if (i >= 2) sprintf(buf,"%2d",j / 7); buf += 2,i -= 2;
- break;
- case 'x':
- j = strftime(buf,i,__drep,t); buf += j,i -= j;
- break;
- case 'X':
- j = strftime(buf,i,__trep,t); buf += j,i -= j;
- break;
- case 'y':
- if (i >= 2) sprintf(buf,"%2d",t->tm_year); buf += 2,i -= 2;
- break;
- case 'Y':
- if (i >= 4) sprintf(buf,"%4d",t->tm_year + 1900); buf += 4,i -= 4;
- break;
- case 'Z':
- s = (char *)t->tm_zone;
- goto scp;
- break;
- default:
- *buf++ = *fmt,i--;
- break;
- }
- fmt++;
- }
- }
-
- *buf = 0;
-
- return((*fmt) ? 0 : max - i);
- }
-